<?php

//封装PDODB类
//
class PDODB implements I_DAO {

	private $host;
	private $port;
	private $user;
	private $pass;
	private $charset;
	private $dbname;
	private $dsn;
	private $pdo;
	private static $instance;

	//构造方法
	//
	private function __construct($arr){
		//初始化属性
		$this->initparams($arr);
		//初始化dsn
		$this->initdsn();
		//实例化pdo对象
		$this->initpdo();
		//初始化PDO属性
		$this->initattribute();
	}

		/**
	 * 用于获得单例对象
	 * @param array $arr 传递给构造方法的数组参数
	 */
	public static function getInstance($arr) {
		if(!self::$instance instanceof self) {
			self::$instance = new self($arr);
		}
		return self::$instance;
	}

	private function initparams($arr) {
		// 初始化属性
		$this->host = isset($arr['host']) ? $arr['host'] : 'localhost';
		$this->port = isset($arr['port']) ? $arr['port'] : '3306';
		$this->user = isset($arr['user']) ? $arr['user'] : 'root';
		$this->pass = isset($arr['pass']) ? $arr['pass'] : '';
		$this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8';
		$this->dbname = isset($arr['dbname']) ? $arr['dbname'] : '';
	}

	//初始化dsn
	private function initdsn() {
		$this->dsn = "mysql:host=$this->host;port=$this->port;dbname=$this->dbname;charset=$this->charset";
	}

	//初始化PDO,得到一个PDO对象
	private function initPDO() {
		try{
			$this->pdo = new pdo($this->dsn,$this->user,$this->pass);
		}catch(PDOException $e) {
		echo '数据库连接失败!<br />';
		echo '数据库连接失败!',$e->getcode(),'<br />';
		echo '数据库连接失败!',$e->getmessage(),'<br />';
		echo '数据库连接失败!',$e->getfile(),'<br />';
		echo '数据库连接失败!',$e->getline(),'<br />';
		die;
		}
	}

	//初始化PDO对象属性,走异常模式
	private function initattribute() {
		$this->pdo->setattribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	}

	//输出异常信息
	private function my_error($e) {

		echo 'SQL执行失败!<br />';
		echo '数据库连接失败!',$e->getcode(),'<br />';
		echo '数据库连接失败!',$e->getmessage(),'<br />';
		echo '数据库连接失败!',$e->getfile(),'<br />';
		echo '数据库连接失败!',$e->getline(),'<br />';
		die;
	}

	public function my_query($sql) {
		try{
			$result = $this->pdo->exec($sql);
		}catch(PDOException $e) {
			//调用输出异常信息的方法
			$this->my_error($e);
		}
		return $result;
	}

	public function fetchall($sql) {
		try{
			$stmt = $this->pdo->query($sql);
			$result = $stmt->fetchall(PDO::FETCH_ASSOC);
			//关闭光标,释放结果集资源
			$stmt->closeCursor();
		}catch(PDOException $e) {
			//调用输出异常信息的方法
			$this->my_error($e);
		}
		return $result;
	}

	public function fetchrow($sql) {
		try{
			$stmt = $this->pdo->query($sql);
			$result = $stmt->fetch(PDO::FETCH_ASSOC);
			//关闭光标,释放结果集资源
			$stmt->closeCursor();
		}catch(PDOException $e) {
			//调用输出异常信息的方法
			$this->my_error($e);
		}
		return $result;
	}

		public function fetchcolumn($sql,$i=NULL) {
		try{
			$stmt = $this->pdo->query($sql);
			if(is_null($i)){
				$result = $stmt->fetchcolumn();
			}else{
				$result = $stmt->fetchcolumn($i);
			}
			// 关闭光标,释放结果集资源
			$stmt->closeCursor();
		}catch(PDOException $e) {
			// 调用输出异常信息的方法
			$this->my_error($e);
		}
		return $result;
	}

	private function __clone() {

	}
}